/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarAyudantes;

import com.thoughtworks.xstream.XStream;
import entidad.Persona;
import entidad.Usuario;
import entidad.ayudantias.Solicitudayudantia;
import entidad.ayudantias.Solicitudserayudante;
import entidad.ayudantias.TipoAyudantia;
import entidad.ayudantias.TipoAyudantia.TipoAyudantiaEnum;
import hero.interfaces.BnNodeValue;
import hero.util.HeroException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.sql.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.CreateException;
import javax.faces.context.FacesContext;
import javax.naming.NamingException;
import wasolicitudesfiec.Ayudantias.SolicitarAyudantes.SeleccionDeAyudantes;
import wasolicitudesfiec.SessionBean1;
import wasolicitudesfiec.authentication.AuthenticationPhaseListener;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.CTRL_Base;
import wasolicitudesfiec.logicacontrol.Logica;
import wasolicitudesfiec.registros.Rg_CandidatoAyudante;

/**
 *
 * @author kabad
 */
public class CTRL_SeleccionDeAyudantes extends CTRL_Base {

    private SeleccionDeAyudantes gui;
    private String nombreActividad = "Seleccion de Ayudantes";
    private int horasAyudantia;

    public CTRL_SeleccionDeAyudantes(SeleccionDeAyudantes gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;

        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
    }

    public int getHorasAyudantia() {
        return horasAyudantia;
    }

    public void inicializar() throws MensajeException {
        ArrayList<Rg_CandidatoAyudante> listaRg_CandidatoAyudante = new ArrayList<Rg_CandidatoAyudante>();

        String nombreInstanciaProf;
        Solicitudayudantia solicitudAyudantia;
        TipoAyudantia tipoAyudantia;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProf = this.getNombreInstanciaProceso();
            if (nombreInstanciaProf == null) {
                throw new Exception();
            }
            prjSession.initProject(nombreInstanciaProf);
            int idSolicitud = Integer.parseInt((String) prjSession.getProperty("idSolicitudProceso").getTheValue());
            solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel3(idSolicitud);
            XStream xstream = new XStream();
//        xstream.alias("informe", Solicitudayudantia.class);
//        String xml = xstream.toXML(solicitudAyudantia);
//        System.out.println(xml);
//        
            if(solicitudAyudantia.getRegistroHabilitado()){
            solicitudAyudantia.setRegistroHabilitado(false);
            logica.getLogAyudantia().guardarSolicitudAyudantia(solicitudAyudantia);
            }
            horasAyudantia = solicitudAyudantia.getHorasAyudantias();
            tipoAyudantia = logica.leerTipoAyudantia(solicitudAyudantia);
            // obtener nombre y tipo de ayudnatia
	    String nombreAyudantia="";
            gui.getLabel9().setText(tipoAyudantia.getNombre());
            if (tipoAyudantia.getTipo() == TipoAyudantiaEnum.ACADEMICA) {
		nombreAyudantia=solicitudAyudantia.getMateria().getNombre();
                gui.getLabel10().setText(nombreAyudantia);
            } else {
		nombreAyudantia=solicitudAyudantia.getAyudantiavaria().getNombre();
                gui.getLabel10().setText(nombreAyudantia);
            }
            Rg_CandidatoAyudante rg_CandidatoAyudante;

            for (Solicitudserayudante object : solicitudAyudantia.getListaSolicitudserayudante()) {

                if (object.getRespuestaConfirmacion() != null && object.getRespuestaConfirmacion().equals("Rechazo")) {
                    continue;
                }

                rg_CandidatoAyudante = new Rg_CandidatoAyudante();
                rg_CandidatoAyudante.setSolicitudserayudante(object);
                rg_CandidatoAyudante.setSeleccionado(object.getSeleccionado());
                rg_CandidatoAyudante.setNombreInstancia(solicitudAyudantia.getNombreinstanciaproceso());
                rg_CandidatoAyudante.setDisabled(false);
                if (object.getRespuestaConfirmacion() != null && object.getRespuestaConfirmacion().equals("Acepto")) {
                    rg_CandidatoAyudante.setDisabled(true);
                }


                listaRg_CandidatoAyudante.add(rg_CandidatoAyudante);

            }
	     gui.getPanelNavegacion().getLblNavegacion().setText(Logica.modelo_SolicitarAyudantes+" -> "+ nombreActividad);
            gui.getDp_SeleccionAyudantes().setListaRg_CandidatoAyudante(listaRg_CandidatoAyudante);
            gui.getLabel7().setText(solicitudAyudantia.getHorasAyudantias());
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
              exception.printStackTrace();
             Logger.getLogger(CTRL_SeleccionDeAyudantes.class.getName()).log(Level.SEVERE, null, exception);
           
            throw new MensajeException("No es posible iniciar la solicitud. Por favor, intente luego de unos minutos.");
        }

    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia =
                (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }

    public void extenderRecepcionSolicitudes() throws MensajeException {
        String nombreInstanciaProceso;
        String nombreActividad2 = "Registro de Estudiantes para Ayudantia";
        BnNodeValue actividad;
        Solicitudayudantia solicitud;
        Solicitudayudantia solicitud2;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                throw new Exception();
            }
            prjSession.initProject(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            
            int idSolicitud = Integer.parseInt(prjSession.getProperty("idSolicitudProceso").getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantia(idSolicitud);
            java.util.Date fecha = (java.util.Date) gui.getCalendar1().getValue();
            Date fechamaxregistro = new Date(fecha.getTime());
            if(!(fechamaxregistro.compareTo(solicitud.getFechainicioayudantia()) <0))               
               throw new MensajeException("Fecha máxima recepción de solicitudes debe ser anterior a fecha inicio de la ayudantía: "+solicitud.getFechainicioayudantia());
           
            solicitud.setFechaMaxRegistro(fechamaxregistro);
            java.util.Date fechamod = (java.util.Date) new java.util.Date();
            solicitud.setFechamodificacion(new Date(fechamod.getTime()));           
           solicitud.setFechaMaxConfimacion(null);
            solicitud2 = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);
            prjSession.setNodeProperty(nombreActividad, "DecisionSeleccionAyudantes", "Prorroga");
            prjSession.setNodeProperty(nombreActividad, "idSolicitudActividad", solicitud2.getIdSolicitudAyudantia() + "");
            prjSession.setProperty("fechaMaxRegistro", fechamaxregistro.getTime() + "");
            
            solicitud.setRegistroHabilitado(true);
            solicitud.setFechamodificacion(fechamaxregistro);                
            solicitud2 = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);// Este es una Solicitud que se usara en "Registro de Estudiantes para Ayudantia"
            prjSession.setProperty("idTempSolicitudActividad", solicitud2.getIdSolicitudAyudantia() + "");
            //cambiar ejecucion a manual en la actividad Registro de Estudiantes para Ayudantia
            prjSession.setNodeType(nombreActividad2, hero.interfaces.Constants.Nd.AND_JOIN_NODE);
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);
            
            //falta enviar correo masivo sobre prorroga para subir solicitudes 

        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
             exception.printStackTrace();
             Logger.getLogger(CTRL_SeleccionDeAyudantes.class.getName()).log(Level.SEVERE, null, exception);
           throw new MensajeException("No es posible guardar la solicitud. Por favor, intente luego de unos minutos.");
        }
    }

    public boolean guardarSeleccion() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;

        Solicitudayudantia solicitud;
        Solicitudayudantia solicitudTemp;
        Solicitudayudantia solicitud2;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                throw new Exception();
            }
            prjSession.initProject(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            //seteamos la fecha max de recepcion de solicitudes
            int idSolicitud = Integer.parseInt(prjSession.getProperty("idSolicitudProceso").getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantia(idSolicitud);
            java.util.Date fecha = (java.util.Date) gui.getCalendar2().getText();
            Date fechaMaxConfirmacion = new Date(fecha.getTime());
            if(!(fechaMaxConfirmacion.compareTo(solicitud.getFechainicioayudantia()) <0))               
               throw new MensajeException("Fecha máxima recepción confirmación de ayudantes debe ser anterior a fecha inicio de la ayudantía: "+solicitud.getFechainicioayudantia());
           
            solicitud.setFechaMaxConfimacion(fechaMaxConfirmacion);
             java.util.Date fechamod = (java.util.Date) new java.util.Date();
            solicitud.setFechamodificacion(new Date(fechamod.getTime()));            
             solicitud2 = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);
           
            prjSession.setNodeProperty(nombreActividad, "DecisionSeleccionAyudantes", "SeguirProceso");
            prjSession.setProperty("fechaMaxConfirmacion", fechaMaxConfirmacion.getTime() + "");
            prjSession.setNodeProperty(nombreActividad, "idSolicitudActividad", solicitud2.getIdSolicitudAyudantia() + "");

             solicitud.setFechamodificacion(fechaMaxConfirmacion); 
            solicitudTemp = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);// Este es una Solicitud que se usara en "Esperando Confirmacion de Estudiantes Seleccionados"
            prjSession.setProperty("idTempSolicitudActividad", solicitudTemp.getIdSolicitudAyudantia() + "");
          usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);
            
            //falta comprobar que si selecciona escriba una cantidad 
            setSeleccionados(solicitud2, solicitudTemp);
            
             return true;
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
              exception.printStackTrace();
             Logger.getLogger(CTRL_SeleccionDeAyudantes.class.getName()).log(Level.SEVERE, null, exception);          
            throw new MensajeException("No es posible guardar la solicitud. Por favor, intente luego de unos minutos.");
        }
    }

    private void setSeleccionados(Solicitudayudantia solAyudActividadSeleccion, Solicitudayudantia solAyudActividadEsperandoConf) throws MensajeException {
        ArrayList<Rg_CandidatoAyudante> listaRg_CandidatoAyudante = gui.getDp_SeleccionAyudantes().getListaRg_CandidatoAyudante();
        BnNodeValue actividad;
        Usuario usuarioConectado;
        SessionBean1 sessionBean1 = (SessionBean1) externalContext.getSessionMap().get("SessionBean1");
        usuarioConectado =(Usuario) externalContext.getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
                
        prjSession = logica.getProjectSession();
        usrSession = logica.getUserSession();
        Rg_CandidatoAyudante rg_candidato;
        String nombreActividadAprob = "Aprobacion de Solicitud";

        logica.autenticaComodin();
        Solicitudserayudante solicitudserayudante;
        Solicitudserayudante solicitudserayudante2;
        
      try {
            for (Object object : listaRg_CandidatoAyudante) {
                rg_candidato = (Rg_CandidatoAyudante) object;
                String nombreInstanciaProceso = rg_candidato.getSolicitudserayudante().getNombreinstanciaproceso();
                solicitudserayudante = rg_candidato.getSolicitudserayudante();
                //revisamos quienes han sido seleccionados en este momento, y no han sido seleccionados en actividades anterioes
                if (!solicitudserayudante.getSeleccionado() && rg_candidato.isSeleccionado()) {
                    prjSession.initProject(nombreInstanciaProceso);
                    actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividadAprob);
                    if (!(actividad != null &&
                            (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                            actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                        throw new Exception();
                    }
                     java.util.Date fecha = (java.util.Date) gui.getCalendar2().getText();
                   
                    //Relizar actividad AprobacionSolicitud de los estudiantes
                    solicitudserayudante.setSeleccionado(rg_candidato.isSeleccionado());
                    solicitudserayudante.setFechaMaxRecepcionConfirmacion(new Date(fecha.getTime()));
                    logica.getLogAyudantia().guardarSolicitudserayudante(solicitudserayudante);
                 
                    solicitudserayudante2 =  logica.getLogAyudantia().leerSolicitudserayudante(solicitudserayudante.getIdSolicitudSerAyudante());
                    solicitudserayudante2.setFkIdSolicitudAyudantia(solAyudActividadSeleccion.getIdSolicitudAyudantia());
                      java.util.Date fechaMod = new java.util.Date();
                      solicitudserayudante2.setFechamodificacion(new Date(fechaMod.getTime()));
                   //para la actividad aprobacion
                    solicitudserayudante2 = logica.getLogAyudantia().guardarYClonarSolicitudserayudante(solicitudserayudante2);

                    prjSession.setNodeProperty(nombreActividadAprob, "idSolicitudActividad", solicitudserayudante2.getIdSolicitudSerAyudante() + "");
                    prjSession.setNodeProperty(nombreActividadAprob, "Aprobado", "Si");
                    prjSession.setProperty( "fechaMaxRecepcionConfirmacion", fecha.getTime() + "");

                    //almacenamos un registro correspondiente a la actividad  confirmacion del estudiante.
                    //esto lo hacemos para que cuando el estuidnate no conteste igualmente se cree el registro de Confirmacion de estudiante
                    solicitudserayudante.setRespuestaConfirmacion("NoContestado");
                    solicitudserayudante.setFechamodificacion(new Date(fecha.getTime()));
                    logica.getLogAyudantia().guardarSolicitudserayudante(solicitudserayudante);
                    solicitudserayudante.setFkIdSolicitudAyudantia(solAyudActividadEsperandoConf.getIdSolicitudAyudantia());

                    solicitudserayudante2 = logica.getLogAyudantia().clonarSolicitudserayudante(solicitudserayudante); // Este es una Solicitud que se usara en "Confirmacion del Estudiante"
                    prjSession.setProperty("idTempSolicitudActividad", solicitudserayudante2.getIdSolicitudSerAyudante() + "");

                    usrSession.startActivity(nombreInstanciaProceso, nombreActividadAprob);
                    usrSession.terminateActivity(nombreInstanciaProceso, nombreActividadAprob);

                }
            }
            logica.autentica(usuarioConectado.getUsuario(), usuarioConectado.getPassword());
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
             exception.printStackTrace();
             Logger.getLogger(CTRL_SeleccionDeAyudantes.class.getName()).log(Level.SEVERE, null, exception);          
            throw new MensajeException("No es posible guardar los datos de la solicitud. Por favor, intente luego de unos minutos.");
          }
    }

    public boolean cancelarProceso() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudayudantia solicitud2;
        try {
            Solicitudayudantia solicitud;
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                throw new Exception();
            }
            prjSession.initProject(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitud = Integer.parseInt(prjSession.getProperty("idSolicitudProceso").getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantiaNivel3(idSolicitud);
            java.util.Date fechamod = (java.util.Date) new java.util.Date();
            solicitud.setFechamodificacion(new Date(fechamod.getTime()));                        
            solicitud.setEstado("Cancelada");
            solicitud2 = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);
            prjSession.setNodeProperty(nombreActividad, "idSolicitudActividad", solicitud2.getIdSolicitudAyudantia() + "");
            prjSession.setNodeProperty(nombreActividad, "DecisionSeleccionAyudantes", "CancelarSolicitud");
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);
            cancelarProcesosEstudiantes(solicitud);

        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception exception) {
             exception.printStackTrace();
             Logger.getLogger(CTRL_SeleccionDeAyudantes.class.getName()).log(Level.SEVERE, null, exception);          
            throw new MensajeException("No es posible guardar la solicitud. Por favor, intente luego de unos minutos.");
        }
        return true;
    }

    private void cancelarProcesosEstudiantes(Solicitudayudantia solicitudayudantia) throws MensajeException, NamingException, CreateException, RemoteException, RemoteException, HeroException, HeroException, Exception {      
       Usuario usuarioConectado = (Usuario) externalContext.getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
        logica.autenticaComodin();
        logica.getLogAyudantia().cancelarProcesosSolicitarSerAyudante(solicitudayudantia);
        logica.autentica(usuarioConectado.getUsuario(), usuarioConectado.getPassword());

    }
}
